Android Fragment
Activityの中で、部品化されたUI単位として、存在する。
lifecycleを持つが、Activityのlifecycleのように扱おうとすると、いろいろ制約があり、難しい。
主要イベントである、onCreate, onCreateView。この違いは?
下のlifecycleの図をみれば良い。backstackから戻ってくるのが onCreateView.
graphical要素以外を onCreate,
graphicalが必要な際はonCreateView, fragmentはgraphical要素をつける際は、Viewなので onCreateView. でよいかな。
onViewCreatedというmethodも定義されてはいる。
Viewが作成されたあとに処理したいものをかける。eventListenerをsetするとか?
UIの柔軟性をもたらすため。例えば、タブレットでは部品(fragment)を2つ。スマホでは1つと行った対応が可能になる。
Activityと関連付けるには、xmlか codeでtransaction処理
FragmentのActivityへの組み込みは、
XMLレイアウトの<fragment>を用いる静的な方法と、
FragmentTransactionを用いる動的な方法があります。
code:FragmentTransaction.kt
supportFragmentManager.beginTransaction()
.replace(R.id.logitem_container, LogInputFragment.newInstance())
.commitNow()
昔の記事だけど、transactionって何?の状態だったので、よかった。
Fragmentの再生成時の挙動が問題になるよう。
あとは、listenerも作り直す必要がある?
Fragment自体でライフサイクルを持つ。
状態変化のcallbackはあるので、handler? listener?を記述できる。
Activityのライフサイクルの影響下にはある。
Fragment の個別クラスを実装していくには、
onCreateViewで、Viewクラスのインスタンス, layoutで用意したfragmentからのインスタンスを返す方法もある??
昔、書いたけど、何書いてるか不明...
通常は、Fragment ごとに、クラスファイルを実装していく(通常)
class Foo: Fragment() { みたいに。
元のクラスのconstructorは引数を持たないので、引数欲しいときには、Factoryパターンを用意する。
Viewとの違いは?
ライフサイクルがあり?、簡単に破棄されるのが、通常のViewと違う点?
気をつける点
再生成時には、メンバ変数がクリアされてるので、引き渡しの工夫が必要
onPauseなどがされる時に呼ばれる?
override fun onSaveInstanceState(outState: Bundle) { で、
outState.putInt("keyName", value)
override fun onCreate(savedInstance: Bundle?) {
以下で、savedInstanceから引き出し
復帰のライフサイクルイベントは、onCreateView(LayoutInflater,ViewGroup?, Bundle?):View なので、
そこで、必要なfragment内のviewについてのイベント設定をする。
参考:
細かく書いてあり、役立ちそう。
おなじみのcodelab
lifecycle:
onAttachが来てから、onCreateが来る。それから onCreateView,
Activityの中?にいても、backstackに回ることがあり、onCreateViewは頻繁に呼ばれる???(想像)
https://gyazo.com/ceb27b01d98d58ebd0f221a43d9114ad
もっと詳しい lifecycler図がある。
https://gyazo.com/611e18c8f14fb6122b7d45878a5cf6fc
ここが最初に読むのにいいかも。